package com.medusa.aps.business.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.medusa.aps.business.model.constant.RedisConstants;
import com.medusa.aps.business.common.redis.RedisUtil;
import com.medusa.aps.business.global.model.exception.GlobalException;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.List;
import java.util.function.Function;

/**
 * @author miskw
 * @date 2023/11/3
 */
public class PercentageScheduleUtils {
    public static String decimalConvertPercentage(BigDecimal percentageDecimal) {
        return (percentageDecimal == null ? "0.00" : percentageDecimal.setScale(2, RoundingMode.DOWN).toPlainString()) + "%";
    }

    /**
     * 文件名称拼接
     *
     * @param desc 文件描述
     * @return 文件名称
     */
    public static String fileName(String desc) {
        return LocalDate.now().format(DatePattern.PURE_DATE_FORMATTER) + desc;
    }

    /**
     * @param date  校验数据
     * @param filed 校验的字段
     * @param desc  描述
     * @param <T>   数据类型
     */
    public static <T> void valid(List<T> date, Function<T, String> filed, String desc) {
        if (CollUtil.isEmpty(date)) {
            return;
        }
        date.stream().map(filed)
                .distinct()
                .reduce((before, after) -> before + StrUtil.COMMA + after)
                .ifPresent(code -> {
                    throw new GlobalException(StrUtil.format(desc, code));
                });
    }

    /**
     * 校验是否有班制生成工作日历
     */
    public static void validClassSystemGenerateCalendar() {
        boolean flag = ObjectUtil.isNotEmpty(RedisUtil.getCacheObject(RedisConstants.WORKING_CALENDAR_LOCK_KEY));
        if (flag) {
            throw new GlobalException("有班制中的设备正在处理工作日历，请等待处理完之后在进行操作");
        }
    }
}
